﻿using System.Net.Security;
using System.Text.RegularExpressions;

using AhCha.Fortunate.Common.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

using Newtonsoft.Json;
using System.Security.Cryptography.X509Certificates;
using AhCha.Fortunate.ModelsDto.Public;
using AhCha.Fortunate.Common.Const;

namespace AhCha.Fortunate.Api.Controllers.Public
{
    /// <summary>
    /// 开放Api接口
    /// </summary>
    [AllowAnonymous]
    [ApiExplorerSettings(GroupName = SwaggerGroupName.PublicModules)]
    public class OpenApiController(TestConfigs testConfigs) : BaseApiController
    {
        private readonly TestConfigs _TestConfigs = testConfigs;

        [HttpGet]
        public async Task<string> GetTestDelegate(string Key)
        {
            return await _TestConfigs.ExecuteAction(Key);
        }


        /// <summary>
        /// 图片识别
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<OpenApiOutput> AliYunOCR(IFormFile file)
        {
            string Name = Guid.NewGuid().ToString("N");
            //返回绝对路径
            string SavePath = FileUtil.SaveBusinessAttachment(file, Name);

            OpenApiOutput output = new OpenApiOutput();
            string Url = "https://gjbsb.market.alicloudapi.com/ocrservice/advanced";
            var obj = new
            {
                //图像数据：base64编码，要求base64编码后大小不超过25M，最短边至少15px，最长边最大8192px，支持jpg/png/bmp格式，和url参数只能同时存在一个
                img = FileUtil.ConvertImageToDataUri(SavePath),
                //图像url地址：图片完整URL，URL长度不超过1024字节，URL对应的图片base64编码后大小不超过25M，最短边至少15px，最长边最大8192px，支持jpg/png/bmp格式，和img参数只能同时存在一个
                url = "",
                //是否需要识别结果中每一行的置信度，默认不需要。 true：需要 false：不需要
                prob = false,
                //是否需要单字识别功能，默认不需要。 true：需要 false：不需要
                charInfo = false,
                //是否需要自动旋转功能，默认不需要。 true：需要 false：不需要
                rotate = false,
                //是否需要表格识别功能，默认不需要。 true：需要 false：不需要
                table = false,
                //字块返回顺序，false表示从左往右，从上到下的顺序，true表示从上到下，从左往右的顺序，默认false
                sortPage = false,
                //是否需要去除印章功能，默认不需要。true：需要 false：不需要
                noStamp = false,
                //是否需要图案检测功能，默认不需要。true：需要 false：不需要
                figure = false,
                //是否需要成行返回功能，默认不需要。true：需要 false：不需要
                row = false,
                //是否需要分段功能，默认不需要。true：需要 false：不需要
                paragraph = false,
                // 图片旋转后，是否需要返回原始坐标，默认不需要。true：需要  false：不需要
                oricoord = true
            };

            var headers = new Dictionary<string, string>();
            headers.Add("Authorization", "APPCODE dda4a1895a0a4478a2f899a2ce33bafc");
            var reader = await HttpManager.HttpClientPostJson(Url, JsonConvert.SerializeObject(obj), headers);
            var results = JsonConvert.DeserializeObject<Root>(reader);
            if (!string.IsNullOrWhiteSpace(results.content))
            {
                output.Data = results.content;
                Match idCardMatch = Regex.Match(results.content, @"\b\d{17}[\dXx]\b");
                if (idCardMatch.Success)
                {
                    output.IdCard = $"提取到的身份证号: {idCardMatch.Value}";
                    output.Age = $"检测年龄: {CalculateAge(idCardMatch.Value)}岁";
                }
                Match phoneMatch = Regex.Match(results.content, @"\b1[3-9]\d{9}\b");
                if (phoneMatch.Success)
                {
                    output.Phone = $"提取到的手机号: {phoneMatch.Value}";
                }
            }
            return output;
        }

        static int CalculateAge(string idCardNumber)
        {
            // 验证身份证长度（18位）
            if (idCardNumber.Length != 18)
            {
                throw new ArgumentException("身份证号码长度不正确");
            }

            // 提取出生日期部分（第7-14位）
            string birthDateStr = idCardNumber.Substring(6, 8);

            // 解析为日期
            if (!DateTime.TryParseExact(birthDateStr, "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out DateTime birthDate))
            {
                throw new ArgumentException("身份证号码中的出生日期无效");
            }

            // 获取当前日期
            DateTime currentDate = DateTime.Now;

            // 计算年龄
            int age = currentDate.Year - birthDate.Year;

            // 如果今年生日还没过，年龄减1
            if (currentDate.Month < birthDate.Month ||
               (currentDate.Month == birthDate.Month && currentDate.Day < birthDate.Day))
            {
                age--;
            }

            return age;
        }
        static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }

    }
}



